home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / UTIL / MEMORY / OLD / MEM208SRC / FSLib / c / _Free < prev    next >
Text File  |  1993-08-22  |  2KB  |  93 lines

  1. /* Original code (c) Acorn Computers Ltd, 1992-3 */
  2.  
  3. /* $Id: c._Free 3.1 93/03/09 23:12:41 brian Exp $ */
  4.  
  5. #include "FS.h"
  6. /* #define DEBUG */
  7.  
  8. struct usage { int size, free, used; };
  9.  
  10. static char *fixid(char *id, char *buf)
  11. { strcpy(buf,FilingSystemName);
  12.   switch (id[0])
  13.   {
  14.   case ':':
  15.     strcat(buf,":"); break;
  16.   default:
  17.     strcat(buf,"::"); break;
  18.   case '#':
  19.     break;
  20.   }
  21.   strcat(buf,id);
  22.   return buf;
  23. }
  24.  
  25. _kernel_oserror *fsentry_free( FSEntry_Free_Parameter *parm )
  26. {
  27.   char *p;
  28.   int l;
  29.   char buf[256];
  30.   struct usage *u;
  31.   _kernel_oserror *err;
  32.   _kernel_swi_regs r;
  33. #ifdef DEBUG
  34.   printf("Free(%d) %s\n",parm->reason,parm->device_id?parm->device_id:"NULL");
  35. #endif
  36.   switch ( parm->reason )
  37.   {
  38.   case FSEntry_Free_Reason_NoOp:
  39.           return NULL;
  40.   case FSEntry_Free_Reason_GetDeviceName:
  41.         r.r[0]=37;
  42.         r.r[1]=(int)fixid(parm->device_id,buf);
  43.         r.r[2]=(int)&buf;
  44.         r.r[3]=0;
  45.         r.r[4]=0;
  46.         r.r[5]=256;
  47.         err = _kernel_swi(OS_FSControl,&r,&r);
  48.           if (err)
  49.           {
  50. #ifdef DEBUG
  51.   printf("***_Free: FSControl 37 on device %s failed %s\n",fixid(parm->device_id,buf),err->errmess);
  52. #endif
  53.             return err;
  54.           }
  55.           p = strchr(buf,'#');
  56.           if (!p)
  57.           { p=strchr(buf,':');
  58.             if (p)
  59.               p+=2;
  60.             else
  61.               p="";
  62.           }
  63.           l=strlen(p);
  64.           if (l>=2 && p[l-1]=='$' && p[l-2]=='.')
  65.             p[l-2]=0;
  66.           strcpy( parm->third_parameter.name, p );
  67.           parm->reason = strlen(p)+1;
  68.           return NULL;
  69.   case FSEntry_Free_Reason_GetFreeSpace:
  70.           r.r[0]=49;
  71.           r.r[1]=(int)fixid(parm->device_id,buf);
  72.           err = _kernel_swi(OS_FSControl,&r,&r);
  73.           if (err)
  74.           {
  75. #ifdef DEBUG
  76.   printf("***_Free: FSControl 49 on device %s failed %s\n",fixid(parm->device_id,buf),err->errmess);
  77. #endif
  78.             return err;
  79.           }
  80.  
  81.           u = (struct usage *)parm->third_parameter.buffer;
  82.           u->size = r.r[2];
  83.           u->free = r.r[0];
  84.           u->used = u->size - u->free;
  85.           return err;
  86.   case FSEntry_Free_Reason_CompareDevice:
  87.           /* Z set if name and special_field are on device_id */
  88.           return NULL;
  89.   default:
  90.           return ERR(mb_BadParameters);
  91.   }
  92. }
  93.